/*
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package net.sf.l2j.gameserver.handler.bypasshandlers;

import java.util.StringTokenizer;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.custom.DressMeData;
import net.sf.l2j.gameserver.datatables.ItemTable;
import net.sf.l2j.gameserver.handler.IBypassHandler;
import net.sf.l2j.gameserver.handler.voicedcommandhandlers.DressMe;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;

/**
 * @author Anarchy
 *
 */
public class DressMeBypasses implements IBypassHandler
{
	private static final String[] BYPASSES = { "bp_changedressmestatus", "bp_editWindow", "bp_setpart", "bp_gettarget", "bp_main" };
	
	@Override
	public boolean handleBypass(String bypass, L2PcInstance activeChar)
	{
		if (bypass.equals("bp_changedressmestatus"))
		{
			if (activeChar.isDressMeEnabled())
			{
				activeChar.setDressMeEnabled(false);
				activeChar.broadcastUserInfo();
			}
			else
			{
				activeChar.setDressMeEnabled(true);
				activeChar.broadcastUserInfo();
			}
			
			DressMe.sendMainWindow(activeChar);
		}
		
		if (bypass.startsWith("bp_editWindow"))
		{
			String bp = bypass.substring(14);
			StringTokenizer st = new StringTokenizer(bp);
			
			sendEditWindow(activeChar, st.nextToken());
		}
		
		if (bypass.startsWith("bp_setpart"))
		{
			String bp = bypass.substring(11);
			StringTokenizer st = new StringTokenizer(bp);
			
			String part = st.nextToken();
			String type = st.nextToken();
			
			setPart(activeChar, part, type);
		}
		
		if (bypass.startsWith("bp_gettarget"))
		{
			String bp = bypass.substring(13);
			StringTokenizer st = new StringTokenizer(bp);
			
			String part = st.nextToken();
			
			stealTarget(activeChar, part);
		}
		
		if (bypass.equals("bp_main"))
		{
			DressMe.sendMainWindow(activeChar);
		}
		
		return true;
	}
	
	public void stealTarget(L2PcInstance p, String part)
	{
		if (p.getTarget() == null || !(p.getTarget() instanceof L2PcInstance))
		{
			p.sendMessage("Invalid target.");
			return;
		}
		
		L2PcInstance t = (L2PcInstance)p.getTarget();
		
		if (p.getDressMeData() == null)
		{
			DressMeData dmd = new DressMeData();
			p.setDressMeData(dmd);
		}
		
		boolean returnMain = false;
		
		switch (part)
		{
			case "chest":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST) == null)
				{
					p.getDressMeData().setChestId(0);
				}
				else
				{
					p.getDressMeData().setChestId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItemId());
				}
				break;
			}
			case "legs":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) == null)
				{
					p.getDressMeData().setLegsId(0);
				}
				else
				{
					p.getDressMeData().setLegsId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS).getItemId());
				}
				break;
			}
			case "gloves":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) == null)
				{
					p.getDressMeData().setGlovesId(0);
				}
				else
				{
					p.getDressMeData().setGlovesId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES).getItemId());
				}
				break;
			}
			case "boots":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) == null)
				{
					p.getDressMeData().setBootsId(0);
				}
				else
				{
					p.getDressMeData().setBootsId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET).getItemId());
				}
				break;
			}
			case "weap":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) == null)
				{
					p.getDressMeData().setWeapId(0);
				}
				else
				{
					p.getDressMeData().setWeapId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItemId());
				}
				break;
			}
			case "all":
			{
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST) == null)
				{
					p.getDressMeData().setChestId(0);
				}
				else
				{
					p.getDressMeData().setChestId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItemId());
				}
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) == null)
				{
					p.getDressMeData().setLegsId(0);
				}
				else
				{
					p.getDressMeData().setLegsId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS).getItemId());
				}
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) == null)
				{
					p.getDressMeData().setGlovesId(0);
				}
				else
				{
					p.getDressMeData().setGlovesId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES).getItemId());
				}
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) == null)
				{
					p.getDressMeData().setBootsId(0);
				}
				else
				{
					p.getDressMeData().setBootsId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET).getItemId());
				}
				if (t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) == null)
				{
					p.getDressMeData().setWeapId(0);
				}
				else
				{
					p.getDressMeData().setWeapId(t.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItemId());
				}
				returnMain = true;
				break;
			}
		}
		
		p.broadcastUserInfo();
		if (!returnMain)
			sendEditWindow(p, part);
		else
			DressMe.sendMainWindow(p);
	}
	
	public void setPart(L2PcInstance p, String part, String type)
	{
		if (p.getDressMeData() == null)
		{
			DressMeData dmd = new DressMeData();
			p.setDressMeData(dmd);
		}
		
		switch (part)
		{
			case "chest":
			{
				if (Config.DRESS_ME_CHESTS.keySet().contains(type))
				{
					p.getDressMeData().setChestId(Config.DRESS_ME_CHESTS.get(type));
				}
				
				break;
			}
			case "legs":
			{
				if (Config.DRESS_ME_LEGS.keySet().contains(type))
				{
					p.getDressMeData().setLegsId(Config.DRESS_ME_LEGS.get(type));
				}
				
				break;
			}
			case "gloves":
			{
				if (Config.DRESS_ME_GLOVES.keySet().contains(type))
				{
					p.getDressMeData().setGlovesId(Config.DRESS_ME_GLOVES.get(type));
				}
				
				break;
			}
			case "boots":
			{
				if (Config.DRESS_ME_BOOTS.keySet().contains(type))
				{
					p.getDressMeData().setBootsId(Config.DRESS_ME_BOOTS.get(type));
				}
				
				break;
			}
			case "weap":
			{
				if (Config.DRESS_ME_WEAPONS.keySet().contains(type))
				{
					p.getDressMeData().setWeapId(Config.DRESS_ME_WEAPONS.get(type));
				}
				
				break;
			}
		}
		
		p.broadcastUserInfo();
		sendEditWindow(p, part);
	}
	
	public void sendEditWindow(L2PcInstance p, String part)
	{
		NpcHtmlMessage htm = new NpcHtmlMessage(0);
		htm.setFile("./data/html/custom/dressme/edit.htm");
		htm.replace("%part%", part);
		switch (part)
		{
			case "chest":
			{
				if (p.getDressMeData() == null)
				{
					htm.replace("%partinfo%", "You have no custom chest.");
				}
				else
				{
					htm.replace("%partinfo%", p.getDressMeData().getChestId() == 0 ? "You have no custom chest." : ItemTable.getInstance().getTemplate(p.getDressMeData().getChestId()).getName());
				}
				String temp = "";
				for (String s : Config.DRESS_ME_CHESTS.keySet())
				{
					temp += s+";";
				}
				htm.replace("%dropboxdata%", temp);
				break;
			}
			case "legs":
			{
				if (p.getDressMeData() == null)
				{
					htm.replace("%partinfo%", "You have no custom legs.");
				}
				else
				{
					htm.replace("%partinfo%", p.getDressMeData().getLegsId() == 0 ? "You have no custom legs." : ItemTable.getInstance().getTemplate(p.getDressMeData().getLegsId()).getName());
				}
				String temp = "";
				for (String s : Config.DRESS_ME_LEGS.keySet())
				{
					temp += s+";";
				}
				htm.replace("%dropboxdata%", temp);
				break;
			}
			case "gloves":
			{
				if (p.getDressMeData() == null)
				{
					htm.replace("%partinfo%", "You have no custom gloves.");
				}
				else
				{
					htm.replace("%partinfo%", p.getDressMeData().getGlovesId() == 0 ? "You have no custom gloves." : ItemTable.getInstance().getTemplate(p.getDressMeData().getGlovesId()).getName());
				}
				String temp = "";
				for (String s : Config.DRESS_ME_GLOVES.keySet())
				{
					temp += s+";";
				}
				htm.replace("%dropboxdata%", temp);
				break;
			}
			case "boots":
			{
				if (p.getDressMeData() == null)
				{
					htm.replace("%partinfo%", "You have no custom boots.");
				}
				else
				{
					htm.replace("%partinfo%", p.getDressMeData().getBootsId() == 0 ? "You have no custom boots." : ItemTable.getInstance().getTemplate(p.getDressMeData().getBootsId()).getName());
				}
				String temp = "";
				for (String s : Config.DRESS_ME_BOOTS.keySet())
				{
					temp += s+";";
				}
				htm.replace("%dropboxdata%", temp);
				break;
			}
			case "weap":
			{
				if (p.getDressMeData() == null)
				{
					htm.replace("%partinfo%", "You have no custom weapon.");
				}
				else
				{
					htm.replace("%partinfo%", p.getDressMeData().getWeapId() == 0 ? "You have no custom weapon." : ItemTable.getInstance().getTemplate(p.getDressMeData().getWeapId()).getName());
				}
				String temp = "";
				for (String s : Config.DRESS_ME_WEAPONS.keySet())
				{
					temp += s+";";
				}
				htm.replace("%dropboxdata%", temp);
				break;
			}
		}
		
		p.sendPacket(htm);
	}

	@Override
	public String[] getBypassHandlersList()
	{
		return BYPASSES;
	}
}
